//如何加方法
function Cat(name,color) {      //类
    this.name = name,       //this  指向它new过后的实例
    this.color = color,
    this.sayHello=function () {         //构造函数一般不放方法,方法只是准备未来需要做的事，如果每生成一个对象，都会实行一次，消耗性能      方法要申请一个新的空间结构，堆，函数会创建一个新的作用域            
        console.log("喵喵喵");
    }

    
}

//如果将方法放在构造函数中，任何对象的sayHello方法都会重新执行一次，性能消耗的很严重          
//传统面向对象不会多次执行，在实例化的时候，执行就constructor
//那JS如何实现这一点呢？JS发明了一个概念
let cat1 = new Cat('阿花','花色')
cat.sayHello();


//在其他语言中，class关键字可以作为一种围城,围住构造函数和方法,JS没有这种方法（可能是之前）
//而JS解决这种局面的方法，  prototype   在原型链上增加的方法,解决了围城问题    (比喻)    
//prototype  JS的原型机制       constryctor+prototype=JS面向对象            带了JS基于原型式的面向对象              任何构造函数都有一个prototype 属性，挂在火车头后面   Cat.prototype是一个对象
                                                                                                        //补充Cat.prototype.eat = function(){
                                                                                                            //console.log("jerry来一下");       //输出jerry来一下,eat只是一个名字
                                                                                                        //}
//constryctor  构造对象的过程,从一个工厂生产一个对象
Cat.prototype.sayHello = {              //prototype  类的方法  分  离   构造函数,使用最小的开销，实现相同的功能
    function () {                          //对象方法是独立的，它只是挂在constryctor上面（火车示例）
        console.log("喵喵喵");
    }
}

console.log(cat1._proto_);//私有属性    

// Cat.prototype = o;  //连接！！！


//前面有什么问题，需要找到之后接上这一段
//继承
console.log(Cat.prototype.isPrototypeOf(cat1)); //判断cat1是否是继承于Cat
console.log(cat.hasOwnProperty("name"));    //判断cat1上是否拥有这种属性        true
console.log(cat.hasOwnProperty("sayHello"));        //false!!!
